package pe.com.astech.web.dao.impl;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import javax.sql.DataSource;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.support.GeneratedKeyHolder;
import org.springframework.jdbc.support.KeyHolder;
import org.springframework.stereotype.Repository;

import pe.com.astech.web.bean.ModuloBean;
import pe.com.astech.web.bean.PerfilBean;
import pe.com.astech.web.bean.MaquinariaBean;
import pe.com.astech.web.bean.SubModuloBean;
import pe.com.astech.web.bean.TipoModuloBean;
import pe.com.astech.web.dao.MaquinariaDao;
import pe.com.astech.web.exception.DBException;
import pe.com.astech.web.util.Constantes;
import pe.com.astech.web.util.Util;

@Repository
public class MaquinariaDaoImpl implements MaquinariaDao {

	private JdbcTemplate jdbcTemplate;

	private static final Log log = LogFactory
			.getLog(MaquinariaDaoImpl.class);

	@Autowired
	public void setDataSource(DataSource dataSource) {
		this.jdbcTemplate = new JdbcTemplate(dataSource);
	}

	@Override
	public List<MaquinariaBean> obtenerMaquinaria(
			String mensajeTrazabilidad, String id_orden_pedido) {

		String query = "select tm.id_maquinaria,tm.nombre,tm.modelo from maquinaria tm "
				+ "inner join detalle_orden_pedido d on d. maquinaria_ID=tm.id_maquinaria "
				+ "where d.orden_pedido_ID = :id_orden_pedido";
		List<MaquinariaBean> list = new ArrayList<MaquinariaBean>();
		log.info("query : " + query);

		MapSqlParameterSource parameters = new MapSqlParameterSource();
		parameters.addValue("id_orden_pedido", id_orden_pedido);

		NamedParameterJdbcTemplate namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(
				jdbcTemplate);
		List<Map<String, Object>> usrRows = namedParameterJdbcTemplate
				.queryForList(query, parameters);

		for (Map<String, Object> usrRow : usrRows) {

			MaquinariaBean tipoMaquinariaBean = new MaquinariaBean();
			tipoMaquinariaBean.setId_maquinaria(String.valueOf(usrRow
					.get("id_maquinaria")));
			tipoMaquinariaBean.setNombre(String.valueOf(usrRow.get("nombre")));
			tipoMaquinariaBean.setModelo(String.valueOf(usrRow.get("modelo")));

			list.add(tipoMaquinariaBean);

		}

		return list;

	}

	@Override
	public List<MaquinariaBean> obtenerMaquinaria(
			String mensajeTrazabilidad) {
		String query = "select tm.id_maquinaria,tm.nombre,tm.modelo from maquinaria tm " +
						"where tm.nombre like :nombre";
		List<MaquinariaBean> list = new ArrayList<MaquinariaBean>();
		log.info("query : " + query);

		MapSqlParameterSource parameters = new MapSqlParameterSource();
		parameters.addValue("nombre", "%"+Constantes.VACIO+"%");

		NamedParameterJdbcTemplate namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(
				jdbcTemplate);
		List<Map<String, Object>> usrRows = namedParameterJdbcTemplate
				.queryForList(query, parameters);

		for (Map<String, Object> usrRow : usrRows) {

			MaquinariaBean tipoMaquinariaBean = new MaquinariaBean();
			tipoMaquinariaBean.setId_maquinaria(String.valueOf(usrRow
					.get("id_maquinaria")));
			tipoMaquinariaBean.setNombre(String.valueOf(usrRow.get("nombre")));
			tipoMaquinariaBean.setModelo(String.valueOf(usrRow.get("modelo")));

			list.add(tipoMaquinariaBean);

		}

		return list;
	}

	@Override
	public List<MaquinariaBean> buscarMaquinarias(String mensajeTrazabilidad,
			MaquinariaBean maquinariaBean) {
			
		    mensajeTrazabilidad = mensajeTrazabilidad + " buscarMaquinarias";
		
			String query = "";
		
			if(maquinariaBean.getEstado().equals(Constantes.ESTADO_MAQUINARIA_PENDIENTE)){
				query = "SELECT m.id_maquinaria, "+
							   "m.nombre, "+
							   "m.modelo, "+
							   "m.estado, "+
							   "m.ruta_documento, "+
							   "m.empleado_id_empleado, "+
							   "m.empleado_id_supervisor, " +
							   "m.observacion_diseniador, " +
							   "m.observacion_jefe, "+
							   "concat(e.nombre,' ',e.apellido_paterno,' ',e.apellido_materno)as nombredisenador, "+
							   "'' as nombresupervisor "+
							"FROM maquinaria m "+
							"inner join empleado e on e.id_empleado=m.empleado_id_empleado "+
							"where m.nombre like :nombre and m.modelo like :modelo and m.estado=:estado";
			}
			else if(maquinariaBean.getEstado().equals(Constantes.ESTADO_MAQUINARIA_APROBADO) || maquinariaBean.getEstado().equals(Constantes.ESTADO_MAQUINARIA_DESAPROBADO)){
				query = "SELECT m.id_maquinaria, "+
						   "m.nombre, "+
						   "m.modelo, "+
						   "m.estado, "+
						   "m.ruta_documento, "+
						   "m.empleado_id_empleado, "+
						   "m.empleado_id_supervisor, "+
						   "m.observacion_diseniador, " +
						   "m.observacion_jefe, "+
						   "concat(e.nombre,' ',e.apellido_paterno,' ',e.apellido_materno)as nombredisenador, " +
						   "concat(es.nombre,' ',es.apellido_paterno,' ',es.apellido_materno)as nombresupervisor "+
						"FROM maquinaria m "+
						"inner join empleado e on e.id_empleado=m.empleado_id_empleado " +
						"inner join empleado es on es.id_empleado=m.empleado_id_supervisor "+
						"where m.nombre like :nombre and m.modelo like :modelo and m.estado=:estado";
			}
			
			List<MaquinariaBean> list = new ArrayList<MaquinariaBean>();
			log.info(mensajeTrazabilidad + " query : " + query);
			
			MapSqlParameterSource parameters = new MapSqlParameterSource();
			parameters.addValue("nombre", "%"+maquinariaBean.getNombre()+"%");
			parameters.addValue("modelo", "%"+maquinariaBean.getModelo()+"%");
			parameters.addValue("estado", maquinariaBean.getEstado());
			
			NamedParameterJdbcTemplate namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(
					jdbcTemplate);
			List<Map<String, Object>> usrRows = namedParameterJdbcTemplate
					.queryForList(query, parameters);
			
			for (Map<String, Object> usrRow : usrRows) {
			
				MaquinariaBean bean = new MaquinariaBean();
				bean.setId_maquinaria(String.valueOf(usrRow
						.get("id_maquinaria")));
				bean.setNombre(String.valueOf(usrRow.get("nombre")));
				bean.setModelo(String.valueOf(usrRow.get("modelo")));
				bean.setEstado(String.valueOf(usrRow.get("estado")));
				bean.setRuta_documento(String.valueOf(usrRow.get("ruta_documento")));
				bean.setEmpleado_id_empleado(String.valueOf(usrRow.get("empleado_id_empleado")));
				bean.setEmpleado_id_supervisor(String.valueOf(usrRow.get("empleado_id_supervisor")));
				bean.setNombre_empleado(String.valueOf(usrRow.get("nombredisenador")));
				bean.setNombre_supervisor(String.valueOf(usrRow.get("nombresupervisor")));
				bean.setObservacion_diseniador(String.valueOf(usrRow.get("observacion_diseniador")));
				bean.setObservacion_jefe(String.valueOf(usrRow.get("observacion_jefe")));
				
				log.info(mensajeTrazabilidad + " " + bean.toString());
				
				list.add(bean);
			
			}
			
			return list;
	}

	@Override
	public void guardarMaquinaria(String mensajeTrazabilidad,
			MaquinariaBean maquinariaBean) {
		
		String mensajeTransaccionMetodo = mensajeTrazabilidad
				+ "[guardarMaquinaria] ";
		
		log.info(mensajeTrazabilidad + "  "
				+ maquinariaBean.toString());
		
		
		String queryInsert = "insert into maquinaria (" +
					"nombre,"+
					"modelo,"+
					"estado,"+
					"ruta_documento,"+
					"observacion_diseniador,"+
					"observacion_jefe,"+
					"empleado_id_empleado,"+
					"empleado_id_supervisor) "+
					"values ("+
					":nombre,"+
					":modelo,"+
					":estado,"+
					":ruta_documento,"+
					":observacion_diseniador,"+
					":observacion_jefe,"+
					":empleado_id_empleado,"+
					":empleado_id_supervisor) ";
		
		log.info(mensajeTrazabilidad + " queryInsert : " + queryInsert);
		String resultado = "";
		
		MapSqlParameterSource parametersInsert = new MapSqlParameterSource();
		parametersInsert.addValue("nombre", maquinariaBean.getNombre_new());
		parametersInsert.addValue("modelo", maquinariaBean.getModelo_new());
		parametersInsert.addValue("estado", Constantes.ESTADO_MAQUINARIA_PENDIENTE);
		parametersInsert.addValue("ruta_documento", maquinariaBean.getRuta_documento());
		parametersInsert.addValue("observacion_diseniador", maquinariaBean.getObservacion_diseniador());
		parametersInsert.addValue("observacion_jefe",maquinariaBean.getObservacion_jefe());
		parametersInsert.addValue("empleado_id_empleado",maquinariaBean.getEmpleado_id_empleado());
		parametersInsert.addValue("empleado_id_supervisor",null);
		
		NamedParameterJdbcTemplate namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(
				jdbcTemplate);
		
		namedParameterJdbcTemplate.update(queryInsert, parametersInsert);
		
	}

	@Override
	public void actualizarMaquinaria(String mensajeTrazabilidad,
			MaquinariaBean maquinariaBean) {

		mensajeTrazabilidad = mensajeTrazabilidad
				+ "[actualizarMaquinaria] ";
		
		log.info(mensajeTrazabilidad + "  "
				+ maquinariaBean.toString());
				
		String query = "update maquinaria set " +
					"estado=:estado,"+
					"observacion_jefe=:observacion_jefe,"+
					"empleado_id_supervisor=:empleado_id_supervisor "+
					"where id_maquinaria=:id_maquinaria ";
		
		log.info(mensajeTrazabilidad + " queryUpdate : " + query);
		
		MapSqlParameterSource parameters = new MapSqlParameterSource();
		parameters.addValue("estado", maquinariaBean.getEstado_new());
		parameters.addValue("observacion_jefe",maquinariaBean.getObservacion_jefe());
		parameters.addValue("empleado_id_supervisor",maquinariaBean.getEmpleado_id_supervisor());
		parameters.addValue("id_maquinaria",maquinariaBean.getId_maquinaria());
		
		NamedParameterJdbcTemplate namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(
				jdbcTemplate);
		
		namedParameterJdbcTemplate.update(query, parameters);
	}

	@Override
	public String guardarModulo(String mensajeTrazabilidad, ModuloBean moduloBean,String id_maquinaria) {
		
		String mensajeTransaccionMetodo = mensajeTrazabilidad
				+ "[guardarModulo] ";
		
		log.info(mensajeTrazabilidad + "  "
				+ moduloBean.toString());
		
		
		String queryInsert = "insert into modulo "+
					"(nombre, "+
					"maquinaria_id_maquinaria, "+
					"tipo_modulo_id_tipo_modulo) "+
					"values ("+
					":nombre,"+
					":maquinaria_id_maquinaria,"+
					":tipo_modulo_id_tipo_modulo)";
		
		log.info(mensajeTrazabilidad + " queryInsert : " + queryInsert);
		
		MapSqlParameterSource parametersInsert = new MapSqlParameterSource();
		parametersInsert.addValue("nombre", moduloBean.getNombre());
		parametersInsert.addValue("maquinaria_id_maquinaria", id_maquinaria);
		parametersInsert.addValue("tipo_modulo_id_tipo_modulo", moduloBean.getTipo_modulo_id_tipo_modulo());
		
		NamedParameterJdbcTemplate namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(
				jdbcTemplate);
		
		KeyHolder keyHolder = new GeneratedKeyHolder();
		
		namedParameterJdbcTemplate.update(queryInsert, parametersInsert,keyHolder);
		log.info(mensajeTransaccionMetodo + " keyHolder "
				+ keyHolder.getKey().intValue());
		
		return String.valueOf(keyHolder.getKey().intValue());
	}

	@Override
	public void guardarSubModulo(String mensajeTrazabilidad,String id_modulo, 
			SubModuloBean subModuloBean) {

		String mensajeTransaccionMetodo = mensajeTrazabilidad
				+ "[guardarSubModulo] ";
		
		log.info(mensajeTransaccionMetodo + "  "
				+ subModuloBean.toString());
		
		
		String queryInsert = "INSERT INTO submodulo " +
								"( " +
								"codigo, " +
								"nombre, " +
								"especificacion, " +
								"componente, " +
								"accesorios, " +
								"verificar, " +
								"modulo_id_modulo) "+
								"values ("+
								":codigo,"+
								":nombre,"+
								":especificacion,"+
								":componente," +
								":accesorios," +
								":verificar," +
								":modulo_id_modulo)";
		
		log.info(mensajeTrazabilidad + " queryInsert : " + queryInsert);
		MapSqlParameterSource parametersInsert = new MapSqlParameterSource();
		parametersInsert.addValue("codigo", subModuloBean.getCodigo());
		parametersInsert.addValue("nombre", subModuloBean.getNombre());
		parametersInsert.addValue("especificacion", subModuloBean.getEspecificacion());
		parametersInsert.addValue("componente", subModuloBean.getComponente());
		parametersInsert.addValue("accesorios", subModuloBean.getAccesorios());
		parametersInsert.addValue("verificar", subModuloBean.getVerificable());
		parametersInsert.addValue("modulo_id_modulo", id_modulo);
		
		NamedParameterJdbcTemplate namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(
				jdbcTemplate);
		namedParameterJdbcTemplate.update(queryInsert, parametersInsert);		
	}

	@Override
	public List<TipoModuloBean> listarTipoModulo() {
		
		String query = "select id_tipo_modulo,tipo from tipo_modulo  "
				+ "where tipo like :tipo";
		List<TipoModuloBean> list = new ArrayList<TipoModuloBean>();
		log.info("query : " + query);
		
		MapSqlParameterSource parameters = new MapSqlParameterSource();
		parameters.addValue("tipo", "%" + Constantes.VACIO + "%"  );
		
		NamedParameterJdbcTemplate namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(
				jdbcTemplate);
		List<Map<String, Object>> usrRows = namedParameterJdbcTemplate
				.queryForList(query, parameters);

		for (Map<String, Object> usrRow : usrRows) {
			TipoModuloBean bean = new TipoModuloBean();
			bean.setId_tipo_modulo(String.valueOf(usrRow.get("id_tipo_modulo")));
			bean.setTipo(String.valueOf(usrRow.get("tipo")));

			list.add(bean);
		}

		return list;
	}

}
